package br.com.maiscontrole.view.site.beans.abst;

import java.lang.reflect.Constructor;
import java.lang.reflect.ParameterizedType;

import javax.annotation.PostConstruct;

import br.com.base.model.impl.EntidadeImpl;
import br.com.base.persistencia.filter.Filtro;
import br.com.maiscontrole.facade.Facade;

/**
 * 
 * @author milton
 *
 * @param <ENTITY>
 */
public abstract class AbstractListMB<ENTIDADE extends EntidadeImpl, ENTIDADE_VIEW extends AbstractListMDV<ENTIDADE, FILTER>, FILTER extends Filtro> extends AbstractMB implements IAbstractListMB {

	private ENTIDADE_VIEW view;
	private Class<ENTIDADE_VIEW> classeViewDV;

	public AbstractListMB() {
		super();
	}

	@Override
	public String consultar(){
		this.getView().consultar();
		return this.tratarConsulta();
	}

	@SuppressWarnings("unchecked")
	public void criarView() throws Exception {
		ParameterizedType type = ((ParameterizedType) this.getClass().getGenericSuperclass());
		this.classeViewDV = (Class<ENTIDADE_VIEW>) type.getActualTypeArguments()[1];
		Constructor<ENTIDADE_VIEW> ctor = this.classeViewDV.getDeclaredConstructor(Facade.class);
		this.setView(ctor.newInstance(this.getFacade()));
	}

	public Class<ENTIDADE_VIEW> getClasseViewDV() {
		return this.classeViewDV;
	}

	public ENTIDADE_VIEW getView() {
		return this.view;
	}

	public String preConsultar(){
		this.getView().limpar();
		this.getView().consultar();
		return this.tratarPreConsulta();
	}

	@PostConstruct
	@Override
	public void setarDados() {
		try {
			this.criarView();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void setView(ENTIDADE_VIEW view) {
		this.view = view;
	}

	public abstract String tratarConsulta();

	public abstract String tratarPreConsulta();

}
